﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Entidades.Basicas;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Hospedes
{
    public partial class EditarHospede : System.Web.UI.Page
    {
        WebServices servicos = new WebServices();
        GeralServices geral = null;
        HospedeService servico = new HospedeService();
        string CPF = null;
        int tipoHospede;

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Hospedes)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                geral = new GeralServices();
                //popular o dropdown estados
                ddlEstado.DataSource = geral.GetEstados();
                ddlEstado.DataTextField = "nome";
                ddlEstado.DataValueField = "sigla";
                ddlEstado.DataBind();

                //São Paulo será o estado default
                ddlEstado.SelectedValue = "SP";

                //Chama o serviço de empresas
                EmpresaService servicoEmpresa = new EmpresaService();
                ddlEmpresas.DataSource = servicoEmpresa.RecuperarEmpresas();
                ddlEmpresas.DataTextField = "Nome";
                ddlEmpresas.DataValueField = "CNPJ";
                ddlEmpresas.DataBind();

                //Se nao vier parametro, redireciona o usuario para a tela inicial
                if (Request.Params["cpf"] == null || Request.Params["tipoHospede"] == null)
                {
                    //Redireciona para a pagina inicial
                    Response.Redirect("~/");
                }

                //Recupera o parametro da URL
                CPF = Request.Params["cpf"];
                tipoHospede = Convert.ToInt32(Request.Params["tipoHospede"]);

                //hospede particular
                if (tipoHospede == 1)
                {
                   //chama o serviço que busca no banco de dados o hóspede correspondente
                    HospedeParticular hospede = servico.RecuperarDetalhesHospedeParticular(CPF);

                    //Monta o formulario para o usuario
                    if (hospede != null)
                    {
                        txtNome.Text = hospede.Nome;
                        txtNascimento.Text = Convert.ToString(hospede.Nascimento).Substring(0, 10);                     

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Telefone[0]))
                        {
                            txtDDDTelefone1.Text = hospede.Contato.Telefone[0].Substring(0, 2);
                            txtTelefone1.Text = hospede.Contato.Telefone[0].Substring(2);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Telefone[1]))
                        {
                            txtDDDTelefone2.Text = hospede.Contato.Telefone[1].Substring(0, 2);
                            txtTelefone2.Text = hospede.Contato.Telefone[1].Substring(2);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Celular[0]))
                        {
                            txtDDDCelular2.Text = hospede.Contato.Celular[0].Substring(0, 2);
                            txtCelular2.Text = hospede.Contato.Celular[0].Substring(2);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Celular[1]))
                        {
                            txtDDDCelular1.Text = hospede.Contato.Celular[1].Substring(0, 2);
                            txtCelular1.Text = hospede.Contato.Celular[1].Substring(2);
                        }


                        txtEmail.Text = hospede.Contato.Email;
                        txtLogradouro.Text = hospede.Endereco.Logradouro;
                        txtBairro.Text = hospede.Endereco.Bairro;
                        txtCEP.Text = hospede.Endereco.CEP;
                        txtNumero.Text = Convert.ToString(hospede.Endereco.Numero);
                        txtCidade.Text = hospede.Endereco.Cidade;
                        ddlEstado.SelectedValue = hospede.Endereco.Estado.sigla;
                        txtComplemento.Text = hospede.Endereco.Complemento;
                        txtCPF.Text = hospede.CPF;
                        txtRG.Text = hospede.RG;
                        Session["RG"] = hospede.RG;

                        

                    }

                }
                //hospede faturado 
                else if (tipoHospede == 2)
                {
                    ckbFaturado.Checked = true;
                    plnFaturado.Visible = true;

                    //chama o serviço que busca no banco de dados o hospede correspondente
                    HospedeFaturado hospede = servico.RecuperarDetalhesHospedeFaturado(CPF);

                    //Monta o formulario para o usuario
                    if (hospede != null)
                    {
                        txtNome.Text = hospede.Nome;
                        txtNascimento.Text = Convert.ToString(hospede.Nascimento).Substring(0, 10);

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Telefone[0]))
                        {
                            txtDDDTelefone1.Text = hospede.Contato.Telefone[0].Substring(0, 2);
                            txtTelefone1.Text = hospede.Contato.Telefone[0].Substring(2);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Telefone[1]))
                        {
                            txtDDDTelefone2.Text = hospede.Contato.Telefone[1].Substring(0, 2);
                            txtTelefone2.Text = hospede.Contato.Telefone[1].Substring(2, 8);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Celular[0]))
                        {
                            txtDDDCelular1.Text = hospede.Contato.Celular[0].Substring(0, 2);
                            txtCelular1.Text = hospede.Contato.Celular[0].Substring(2, 8);
                        }

                        //Verifica se é não null para não gerar exceção
                        if (!String.IsNullOrEmpty(hospede.Contato.Celular[1]))
                        {
                            txtDDDCelular2.Text = hospede.Contato.Celular[1].Substring(0, 2);
                            txtCelular2.Text = hospede.Contato.Celular[1].Substring(2, 8);
                        }


                        txtEmail.Text = hospede.Contato.Email;
                        txtLogradouro.Text = hospede.Endereco.Logradouro;
                        txtBairro.Text = hospede.Endereco.Bairro;
                        txtCEP.Text = hospede.Endereco.CEP;
                        txtNumero.Text = Convert.ToString(hospede.Endereco.Numero);
                        txtCidade.Text = hospede.Endereco.Cidade;
                        ddlEstado.SelectedValue = hospede.Endereco.Estado.sigla;
                        txtComplemento.Text = hospede.Endereco.Complemento;
                        txtCPF.Text = hospede.CPF;
                        txtRG.Text = hospede.RG;
                        txtCargoEmpresa.Text = hospede.CargoEmpresa;
                        ddlEmpresas.SelectedValue = hospede.CNPJ;
                        Session["RG"] = hospede.RG;
                        

                      
                    }

                }
            }
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            string RGAtual;
            //Recupera o parametro da URL
            CPF = Request.Params["cpf"];
            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios fora preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtNascimento.Text,
                txtCPF.Text,
                txtRG.Text           
            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
            
            //faz a validação da data de nascimento             
            if (!comum.ValidaData(txtNascimento.Text))
            {
                MensagemJS("ERRO: Data(s) inválida(s)");
                return;
            }

            //Faz validação do CPF
            if (!comum.ValidaCPF(txtCPF.Text))
            {
                MensagemJS("ERRO: CPF digitado não é válido");
               return;
            }

            //Faz validação do RG
            if (!comum.ValidaRG(txtRG.Text))
            {
                MensagemJS("ERRO: RG digitado não é válido");
                return;
            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtCelular1.Text);
            Telefones.Add(txtCelular2.Text);
            Telefones.Add(txtTelefone1.Text);
            Telefones.Add(txtTelefone2.Text);

            DDDs.Add(txtDDDCelular1.Text);
            DDDs.Add(txtDDDCelular2.Text);
            DDDs.Add(txtDDDTelefone1.Text);
            DDDs.Add(txtDDDTelefone2.Text);


            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Telefones digitados não são válidos");
                return;
            }

            //se o hóspede a ser cadastrado for faturado
            if (ckbFaturado.Checked == true)
            {
                RGAtual = servico.RecuperarDetalhesHospedeFaturado(CPF).RG;

                //Verifica se o RG ja esta cadastrado
                if (!servico.VerificarRGCadastradoFaturado(txtRG.Text, RGAtual))
                {
                    MensagemJS("ERRO: RG já cadastrado!");
                    return;
                }

            }
            else
            {
                RGAtual = servico.RecuperarDetalhesHospedeParticular(CPF).RG;

                //Verifica se o RG ja esta cadastrado
                if (!servico.VerificarRGCadastradoParticular(txtRG.Text, RGAtual))
                {
                    MensagemJS("ERRO: RG já cadastrado!");
                    return;
                }

            }
          
            EditaHospede();
        }

        /// <summary>
        /// Método privado que monta um objeto hóspede particular ou faturado e o envia para o serviço editá-lo nos bancos
        /// </summary>
        private void EditaHospede()
        {
            //Recupera o parametro da URL
            CPF = Request.Params["cpf"];
            tipoHospede = Convert.ToInt32(Request.Params["tipoHospede"]);

            int numero = 0;
            //Evitar excessao
            if (!String.IsNullOrEmpty(txtNumero.Text))
            {
                numero = Convert.ToInt32(txtNumero.Text);
            }
            

            //monta o objeto hóspede particular
            try
            {
                HospedeParticular hospede = new HospedeParticular()
                {
                    Nome = txtNome.Text.Trim(),
                    Nascimento = Convert.ToDateTime(txtNascimento.Text),
                    Contato = new Contato()
                    {

                        Celular = new List<string>() { (txtDDDCelular1.Text + txtCelular1.Text), (txtDDDCelular2.Text + txtCelular2.Text) },
                        Telefone = new List<string>() { (txtDDDTelefone1.Text + txtTelefone1.Text), (txtDDDTelefone2.Text + txtTelefone2.Text) },
                        Email = txtEmail.Text

                    },
                    Endereco = new Endereco()
                    {
                        Logradouro = txtLogradouro.Text.Trim(),
                        Bairro = txtBairro.Text.Trim(),
                        CEP = txtCEP.Text,
                        Cidade = txtCidade.Text.Trim(),
                        Complemento = txtComplemento.Text.Trim(),
                        Estado = new Estado() { nome = ddlEstado.SelectedItem.Text, sigla = ddlEstado.SelectedValue },
                        Numero = numero
                    },

                    CPF = txtCPF.Text,
                    RG = txtRG.Text
                   
                };

                //se o hóspede a ser cadastrado for faturado
                if (ckbFaturado.Checked == true)
                {
                    HospedeFaturado hospedeFaturado = new HospedeFaturado()
                    {
                        CargoEmpresa = txtCargoEmpresa.Text,
                        Contato = hospede.Contato,
                        CPF = hospede.CPF,
                        Endereco = hospede.Endereco,
                        CNPJ = ddlEmpresas.SelectedValue,
                        Nascimento = hospede.Nascimento,
                        Nome = hospede.Nome,
                        RG = hospede.RG
                    };

                    //chama o serviço que insere o hóspede fatrurado nos bancos de dados
                    if (servico.EditarHospedeFaturado(CPF, hospedeFaturado))
                    {
                        MensagemJS("Hóspede editado com sucesso!");
                        HttpContext.Current.Cache.Remove("Lista_Hospedes_Faturados");
                    }
                    else
                    {
                        MensagemJS("ERRO: Hóspede com esse CPF já foi adicionado");
                        return;
                    }

                }
                //se o hóspede a ser cadastrado for particular
                else
                {

                    //chama o serviço que insere o hóspede particular nos bancos de dados
                    if (servico.EditarHospedeParticular(CPF, hospede))
                    {
                        MensagemJS("Hóspede editado com sucesso!");
                        HttpContext.Current.Cache.Remove("Lista_Hospedes_Particulares");
                    }
                    else
                    {
                        MensagemJS("ERRO: Hóspede com esse CPF já existente");
                        return;
                    }
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;
            }

        }

        /// <summary>
        /// Método usado para limpar todos os campos
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = null;
            txtNascimento.Text = null;
            txtDDDCelular1.Text = null;
            txtDDDCelular2.Text = null;
            txtDDDTelefone1.Text = null;
            txtDDDTelefone2.Text = null;
            txtCelular1.Text = null;
            txtTelefone1.Text = null;
            txtCelular2.Text = null;
            txtEmail.Text = null;
            txtTelefone2.Text = null;
            txtLogradouro.Text = null;
            txtBairro.Text = null;
            txtComplemento.Text = null;
            txtCEP.Text = null;
            txtCidade.Text = null;
            txtNumero.Text = null;
            txtCPF.Text = null;
            txtRG.Text = null;
            txtCargoEmpresa.Text = null;
            
        }

        /// <summary>
        /// Busca por CEP  o endereço correspondente
        /// </summary>
        protected void btnBuscaCEP_Click(object sender, EventArgs e)
        {
            //Chama o serviço que faz essa busca
            Endereco endereco = servicos.GetEnderecoPorCEP(txtCEP.Text);

            //Preenche os textbox com o endereço correspondente
            txtBairro.Text = endereco.Bairro;
            txtLogradouro.Text = endereco.Logradouro;
            txtCidade.Text = endereco.Cidade;

            if (!String.IsNullOrEmpty(endereco.Estado.sigla))
                ddlEstado.SelectedValue = endereco.Estado.sigla;

        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            tipoHospede = Convert.ToInt32(Request.Params["tipoHospede"]);

            //Redireciona para a pagina anterior
            if (tipoHospede == 1)
            {
                Response.Redirect("~/Apresentacao/Hospedes/ListarHospedesParticulares.aspx");
            }
            else if (tipoHospede == 2)
            {
                Response.Redirect("~/Apresentacao/Hospedes/ListarHospedesFaturados.aspx");
            }
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
    }
}